

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include "usart.h"
#include "lvgl.h"
#include "lv_port_disp.h"
#include "lv_port_indev.h"
typedef uint16_t u16;
typedef uint8_t  u8;

extern int16_t speed_val ;

#define SAMPLE_UART_NAME       "uart2"    /* 串口设备名称 */
static rt_device_t serial;                /* 串口设备句柄 */    
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;  /* 初始化配置参数 */

u8 mdbdata[8]={0x01,0x03,0X00,0X00,0X00,0X01,0x84,0x0A};//modbus命令数组

u16 USART2_RX_STA;
u8 USART2_RX_BUF[16];
/*
******************************************************************
*                               变量
******************************************************************
*/
/* 定义线程控制块 */

static rt_thread_t lcd_thread = RT_NULL;
static rt_thread_t usart_thread = RT_NULL;

/* 定义semaph控制块 */
rt_sem_t rx_sem = RT_NULL;

/*
*************************************************************************
*                             函数声明
*************************************************************************
*/
static void key_thread_entry(void* parameter);
static void lcd_thread_entry(void* parameter);
static void usart_thread_entry(void* parameter);
static void i2c_thread_entry(void* parameter);
static void flash_thread_entry(void* parameter);
static void iic_test(void);
void Printf_Charater(void);
static rt_err_t uart_input(rt_device_t dev, rt_size_t size);

void spi_test(void);

extern int16_t valAlarm,valFault;

/*
*************************************************************************
*                             main 函数
*************************************************************************
*/
/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{	
    LED_Init();
    LCD_Init();		//初始化LCD
	tp_dev.init();				   		
	lv_init();							//lvgl系统初始化
	lv_port_disp_init();		//lvgl显示接口初始化,放在lv_init()的后面
	lv_port_indev_init();		//lvgl输入接口初始化,放在lv_init()的后面
  lv_tabview_test_start();
  rx_sem = rt_sem_create("rx_sem",
                      0,     /* 信号量初始值，默认有一个信号量 */
                      RT_IPC_FLAG_FIFO); /* 信号量模式 FIFO(0x00)*/
  if(rx_sem != RT_NULL)
    rt_kprintf("semaphor created!\n");        
/* 查找串口设备 */
serial = rt_device_find(SAMPLE_UART_NAME);
if(serial!=NULL)
{

config.baud_rate = BAUD_RATE_9600;        //修改波特率为 9600
config.data_bits = DATA_BITS_8;           //数据位 8
config.stop_bits = STOP_BITS_1;           //停止位 1
config.bufsz     = 128;                   //修改缓冲区 buff size 为 128
config.parity    = PARITY_NONE;           //无奇偶校验位

/* step3：控制串口设备。通过控制接口传入命令控制字，与控制参数 */
rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config);
/* 以中断接收及轮询发送模式打开串口设备 */
rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);
/* 设置接收回调函数 */
rt_device_set_rx_indicate(serial, uart_input);
//rt_device_write(serial, 0, str, (sizeof(str) - 1));
}
else
{
  rt_kprintf("serial find error");
}

  lcd_thread = 
    rt_thread_create( "lcd",
                      lcd_thread_entry,
                      RT_NULL,
                      2048,
                      3,
                      20);
  if(lcd_thread != RT_NULL)
        rt_thread_startup(lcd_thread);
  else 
    return -1;

  usart_thread =                          /* 线程控制块指针 */
  rt_thread_create( "usart",              /* 线程名字 */
                      usart_thread_entry,   /* 线程入口函数 */
                      RT_NULL,             /* 线程入口函数参数 */
                      512,                 /* 线程栈大小 */
                      2,                   /* 线程的优先级 */
                      20);                 /* 线程时间片 */
                   
    /* 启动线程，开启调度 */
   if (usart_thread != RT_NULL)
   {
        rt_thread_startup(usart_thread);
	}
    else
        return -1;

while(1)
{
  rt_device_write(serial, 0, mdbdata, (sizeof(mdbdata) - 1));
  rt_thread_delay(2000);
}


}

/*
*************************************************************************
*                             线程定义
*************************************************************************
*/

static void lcd_thread_entry(void* parameter)
{
  rt_err_t uwRet = RT_EOK;
    while (1)
    {
		tp_dev.scan(0);//触摸扫描
		lv_task_handler();//lvgl的事务处理
    rt_thread_mdelay(10);
    }

}


static void usart_thread_entry(void* parameter)
{
  rt_err_t uwRet = RT_EOK;	
  rt_size_t len;
  u8 res;	
    /* 任务都是一个无限循环，不能返回 */
  while (1)
  {
		uwRet = rt_sem_take(rx_sem,	/* 获取串口中断的信号量 */
                        RT_WAITING_FOREVER); 	  /* 等待时间 */

      len=rt_device_read(serial, -1, &res, 1);

    if(len==1)
    {

		if((USART2_RX_STA&(1<<15))==0)
		{		
			if(USART2_RX_STA<6)		//还可以接收数据
			{

				switch(USART2_RX_STA){
					case 0:if(res==0x01){
						USART2_RX_BUF[USART2_RX_STA++]=res;
					}else{
						USART2_RX_STA=0;
					} ;break;
					case 1:if(res==0x03){
						USART2_RX_BUF[USART2_RX_STA++]=res;
					}else{
						USART2_RX_STA=0;
					} ;break;
					case 2:
						USART2_RX_BUF[USART2_RX_STA++]=res;
					  break;
					default:
						USART2_RX_BUF[USART2_RX_STA++]=res;
						break;
				}
			}
			else 
			{
        USART2_RX_BUF[USART2_RX_STA++]=res;
				USART2_RX_STA|=1<<15;					//强制标记接收完成
			}
	   }		

    }
		
    static u8 wind_data=0;

    if(USART2_RX_STA&0x8000)
    {

      USART2_RX_STA=0;
      wind_data=USART2_RX_BUF[4];
      speed_val=wind_data;

      rt_kprintf("\r\n");
      for(u8 i=0;i<8;i++)//清空串口接收缓冲区清buffer
      {
        rt_kprintf("%x",USART2_RX_BUF[i]);
        USART2_RX_BUF[i]=0;
      }

    }

  }
}

/* 接收数据回调函数 */
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
    //rt_kprintf("received size:size%d",size);
    /* 串口接收到数据后产生中断，调用此回调函数，然后发送接收信号量 */
    rt_sem_release(rx_sem);

    return RT_EOK;
}

/********************************END OF FILE****************************/


